/**程序中间件函数 */
export type MiddlewareType = (
  /**上下文对象 */
  context: ContextType,
  /**行为函数 */
  next: () => Promise<void>
) => Promise<void>;

/**句柄函数 */
export type HandleType = (
  /**上下文对象 */
  context: ContextType,
  /**行为函数 */
  next?: () => Promise<void>
) => Promise<void>;

/**程序上下文对象 */
export type ContextType = {
  /**客户端调用云函数时传入的参数 */
  readonly event: Record<string, any>;
  /**客户端调用云函数时的系统运行环境参数 */
  readonly app: Record<string, any>;
  /**路由地址 */
  readonly url: string;
  /**路由方法 */
  readonly method: string;
  /**路由数据 */
  readonly data: Record<string, any>;
  /**url路径 */
  readonly path: string;
  /**url查询字符串 */
  readonly querystring: string;
  /**url查询参数 */
  readonly query: Record<string, any>;
  /**url路由参数 */
  params: Record<string, any>;
  /**响应结果 */
  body?: any;
  /**全局配置参数 */
  config?: Record<string, any>;
  /**未定义 */
  [propName: string]: any;
};

/**路由配置参数对象 */
export type RourterOptsType = {
  /**路由全局前缀 */
  prefix?: string;
};

/**路由表中间件对象 */
export type RourterStackType = {
  /**路由方法 */
  readonly method: string;
  /**路由路径 */
  readonly path: string;
  /**路由函数队列 */
  readonly requests: MiddlewareType[];
  /**路由参数 */
  params?: Record<string, any>;
};

/**路由表注册对象 */
export type RouterRegOptionType = Pick<
  RouteOptionsType,
  "middleware" | "ignoreGlobalPrefix"
>;

/**路由装饰器注册对象 */
export type RouteOptionsType = {
  /**请求方法，例如："get"、"post" */
  method: string;
  /**路由路径，例如："/api" */
  path?: string;
  /**中间件数组 */
  middleware?: MiddlewareType[];
  /**忽略路由全局前缀 */
  ignoreGlobalPrefix?: boolean;
};

/**路由装饰器绑定对象 */
export type RouteTargetType = RouteOptionsType & {
  handle: (ctx: ContextType) => Promise<any>;
};
